package araujoCoronelVillamayor.plantasVsZombies.appModelsArena;

import araujoCoronelVillamayor.plantasVsZombies.appModelsArena.SesionAppModel;
import araujoCoronelVillamayor.plantasVsZombies.domain.Ataque;
import araujoCoronelVillamayor.plantasVsZombies.domain.AtaqueLog;
import araujoCoronelVillamayor.plantasVsZombies.domain.FactoryZombies;
import araujoCoronelVillamayor.plantasVsZombies.domain.Fila;
import araujoCoronelVillamayor.plantasVsZombies.domain.Zombie;
import com.google.common.base.Objects;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.uqbar.commons.model.ObservableUtils;
import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;

@Observable
@SuppressWarnings("all")
public class AtaqueAppModel implements Serializable {
  private List<Zombie> _zombies;
  
  public List<Zombie> getZombies() {
    return this._zombies;
  }
  
  public void setZombies(final List<Zombie> zombies) {
    this._zombies = zombies;
  }
  
  private Zombie _zombieSeleccionado;
  
  public Zombie getZombieSeleccionado() {
    return this._zombieSeleccionado;
  }
  
  public void setZombieSeleccionado(final Zombie zombieSeleccionado) {
    this._zombieSeleccionado = zombieSeleccionado;
  }
  
  private SesionAppModel _sesionAppModel;
  
  public SesionAppModel getSesionAppModel() {
    return this._sesionAppModel;
  }
  
  public void setSesionAppModel(final SesionAppModel sesionAppModel) {
    this._sesionAppModel = sesionAppModel;
  }
  
  private List<AtaqueLog> _resultadosAtaqueLog;
  
  public List<AtaqueLog> getResultadosAtaqueLog() {
    return this._resultadosAtaqueLog;
  }
  
  public void setResultadosAtaqueLog(final List<AtaqueLog> resultadosAtaqueLog) {
    this._resultadosAtaqueLog = resultadosAtaqueLog;
  }
  
  private AtaqueLog _ataqueLogPaso;
  
  public AtaqueLog getAtaqueLogPaso() {
    return this._ataqueLogPaso;
  }
  
  public void setAtaqueLogPaso(final AtaqueLog ataqueLogPaso) {
    this._ataqueLogPaso = ataqueLogPaso;
  }
  
  private List<AtaqueLog> _ataqueLogColeccion;
  
  public List<AtaqueLog> getAtaqueLogColeccion() {
    return this._ataqueLogColeccion;
  }
  
  public void setAtaqueLogColeccion(final List<AtaqueLog> ataqueLogColeccion) {
    this._ataqueLogColeccion = ataqueLogColeccion;
  }
  
  private Ataque _ataque;
  
  public Ataque getAtaque() {
    return this._ataque;
  }
  
  public void setAtaque(final Ataque ataque) {
    this._ataque = ataque;
  }
  
  public AtaqueAppModel(final SesionAppModel sesionAppModelParametro) {
    ArrayList<AtaqueLog> _arrayList = new ArrayList<AtaqueLog>();
    this.setAtaqueLogColeccion(_arrayList);
    this.setSesionAppModel(sesionAppModelParametro);
    ArrayList<Zombie> _arrayList_1 = new ArrayList<Zombie>();
    this.setZombies(_arrayList_1);
    final FactoryZombies factoryZombies = FactoryZombies.getInstance();
    List<Zombie> _zombies = this.getZombies();
    Zombie _crearColinBlunstone = factoryZombies.crearColinBlunstone();
    _zombies.add(_crearColinBlunstone);
    List<Zombie> _zombies_1 = this.getZombies();
    Zombie _crearColinBlunstone_1 = factoryZombies.crearColinBlunstone();
    _zombies_1.add(_crearColinBlunstone_1);
    List<Zombie> _zombies_2 = this.getZombies();
    Zombie _crearColinBlunstone_2 = factoryZombies.crearColinBlunstone();
    _zombies_2.add(_crearColinBlunstone_2);
    List<Zombie> _zombies_3 = this.getZombies();
    Zombie _crearCranberrie = factoryZombies.crearCranberrie();
    _zombies_3.add(_crearCranberrie);
    List<Zombie> _zombies_4 = this.getZombies();
    Zombie _crearCranberrie_1 = factoryZombies.crearCranberrie();
    _zombies_4.add(_crearCranberrie_1);
    List<Zombie> _zombies_5 = this.getZombies();
    Zombie _crearCranberrie_2 = factoryZombies.crearCranberrie();
    _zombies_5.add(_crearCranberrie_2);
  }
  
  public void atacar(final Fila filaAtacada, final Zombie zombie) {
    SesionAppModel _sesionAppModel = this.getSesionAppModel();
    Fila _filaSeleccionada = _sesionAppModel.getFilaSeleccionada();
    boolean _equals = Objects.equal(_filaSeleccionada, null);
    boolean _not = (!_equals);
    if (_not) {
      SesionAppModel _sesionAppModel_1 = this.getSesionAppModel();
      boolean _filaSeleccionadaNoVacia = _sesionAppModel_1.filaSeleccionadaNoVacia();
      if (_filaSeleccionadaNoVacia) {
        Zombie _zombieSeleccionado = this.getZombieSeleccionado();
        boolean _equals_1 = Objects.equal(_zombieSeleccionado, null);
        boolean _not_1 = (!_equals_1);
        if (_not_1) {
          Zombie _zombieSeleccionado_1 = this.getZombieSeleccionado();
          boolean _tieneVida = _zombieSeleccionado_1.tieneVida();
          if (_tieneVida) {
            SesionAppModel _sesionAppModel_2 = this.getSesionAppModel();
            Ataque _ataque = new Ataque(zombie, filaAtacada, _sesionAppModel_2);
            this.setAtaque(_ataque);
            Ataque _ataque_1 = this.getAtaque();
            _ataque_1.loopDeAtaque();
          } else {
            Zombie _zombieSeleccionado_2 = this.getZombieSeleccionado();
            String _nombre = _zombieSeleccionado_2.getNombre();
            String _plus = (_nombre + " est\u00E1 muerto.");
            UserException _userException = new UserException(_plus);
            throw _userException;
          }
        } else {
          UserException _userException_1 = new UserException("No hay un zombie seleccionado.");
          throw _userException_1;
        }
      } else {
        UserException _userException_2 = new UserException("Todas las plantas de la fila fenecieron.");
        throw _userException_2;
      }
    } else {
      UserException _userException_3 = new UserException("La fila seleccionada no existe.");
      throw _userException_3;
    }
  }
  
  public void refresh() {
    ArrayList<AtaqueLog> _arrayList = new ArrayList<AtaqueLog>();
    this.setResultadosAtaqueLog(_arrayList);
    Ataque _ataque = this.getAtaque();
    List<AtaqueLog> _coleccionDeLogs = _ataque.getColeccionDeLogs();
    this.setResultadosAtaqueLog(_coleccionDeLogs);
    this.setZombieSeleccionado(null);
    List<Zombie> _zombies = this.getZombies();
    ObservableUtils.firePropertyChanged(this, "zombies", _zombies);
  }
}
